package mx.ipn.persistencia.mysql;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;

import mx.ipn.persistencia.FabricaDeDAOs;
import mx.ipn.persistencia.dao.ClienteDAO;
import mx.ipn.persistencia.dao.TarjetaDAO;
import mx.ipn.persistencia.dao.TarjetaClienteDAO;
import mx.ipn.to.ClienteTO;
import mx.ipn.to.TarjetaTO;
import mx.ipn.to.TarjetaClienteTO;

public class TarjetaClienteDAOMySQL implements TarjetaClienteDAO {
	static{FabricaDeDAOsMySQL.iniciaLog(TarjetaClienteDAOMySQL.class);}

	private static final String INSERT = "INSERT INTO tarjeta_cliente (id_tarjeta,id_cliente,activo) VALUES(?,?,?)";
	private static final String ACTIVADESACTIVA = "UPDATE tarjeta_cliente SET activo=? WHERE id_tarjeta_cliente=?";
	private static final String UPDATE = "UPDATE tarjeta_cliente SET id_tarjeta=?,id_cliente=?,activo=? WHERE id_tarjeta_cliente=?";
	private static final String FINDBYID = "SELECT * FROM tarjeta_cliente WHERE id_tarjeta_cliente=?";
	private static final String FINDBYIDTARJETAIDCLIENTE = "SELECT * FROM tarjeta_cliente WHERE id_tarjeta=? AND id_cliente=?";
	private static final String SELECT = "SELECT * FROM tarjeta_cliente";
	private static final String SELECTACTIVO = "SELECT * FROM tarjeta_cliente where activo=true";
	private static final String SELECTACTIVOBYCLIENTE = "SELECT * FROM tarjeta_cliente WHERE activo=true and id_cliente=?";
	private static final String SELECTACTIVOBYTARJETA = "SELECT * FROM tarjeta_cliente WHERE activo=true and id_tarjeta=?";
	private static final String SELECTBYCLIENTE = "SELECT * FROM tarjeta_cliente WHERE id_cliente=?";
	private static final String SELECTBYTARJETA = "SELECT * FROM tarjeta_cliente WHERE id_tarjeta=?";

	@Override
	public short ActivaDesactivaTarjetaCliente(int idTarjetaCliente,
			boolean activa) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(ACTIVADESACTIVA);

			ps.setBoolean(1, activa);
			ps.setInt(2, idTarjetaCliente);

			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

	@Override
	public TarjetaClienteTO findTarjetaClienteById(int idTarjetaCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYID);

			ps.setInt(1, idTarjetaCliente);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				int idCliente = rs.getInt("id_cliente");
				int idTarjeta = rs.getInt("id_tarjeta");
				boolean activo = rs.getBoolean("activo");
				

				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				ClienteDAO clienteDAO = fabricaMySQL.getClienteDAO();
				TarjetaDAO tarjetaDAO = fabricaMySQL.getTarjetaDAO();

				ArrayList<TarjetaTO> listTarjetaTO = new ArrayList<TarjetaTO>();
				ArrayList<ClienteTO> listClienteTO = new ArrayList<ClienteTO>();

				listTarjetaTO.add(tarjetaDAO.findTarjetaById(idTarjeta));
				listClienteTO.add(clienteDAO.findClienteById(idCliente));

				ClienteTO[] arrClienteTO = (ClienteTO[])listClienteTO.toArray(new ClienteTO[listClienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])listTarjetaTO.toArray(new TarjetaTO[listTarjetaTO.size()]);
				
				TarjetaClienteTO TarjetaClienteTO = new TarjetaClienteTO(
						idTarjetaCliente, arrTarjetaTO, arrClienteTO, activo);

				ps.close();
				conexion.close();
				return TarjetaClienteTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TarjetaClienteTO findTarjetaClienteByIdClienteIdTarjeta(
			int idCliente, int idTarjeta) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(FINDBYIDTARJETAIDCLIENTE);

			ps.setInt(1, idTarjeta);
			ps.setInt(2, idCliente);

			ResultSet rs = ps.executeQuery();

			if (rs.next()) {

				int idTarjetaCliente = rs.getInt("id_tarjeta_cliente");
				idCliente = rs.getInt("id_cliente");
				idTarjeta = rs.getInt("id_tarjeta");
				boolean activo = rs.getBoolean("activo");
				

				FabricaDeDAOs fabricaMySQL = FabricaDeDAOs
						.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

				ClienteDAO clienteDAO = fabricaMySQL.getClienteDAO();
				TarjetaDAO tarjetaDAO = fabricaMySQL.getTarjetaDAO();

				ArrayList<TarjetaTO> listTarjetaTO = new ArrayList<TarjetaTO>();
				ArrayList<ClienteTO> listClienteTO = new ArrayList<ClienteTO>();

				listTarjetaTO.add(tarjetaDAO.findTarjetaById(idTarjeta));
				listClienteTO.add(clienteDAO.findClienteById(idCliente));

				ClienteTO[] arrClienteTO = (ClienteTO[])listClienteTO.toArray(new ClienteTO[listClienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])listTarjetaTO.toArray(new TarjetaTO[listTarjetaTO.size()]);
				
				TarjetaClienteTO TarjetaClienteTO = new TarjetaClienteTO(
						idTarjetaCliente, arrTarjetaTO, arrClienteTO, activo);

				ps.close();
				conexion.close();
				return TarjetaClienteTO;
			}

			ps.close();
			conexion.close();
			return null;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public boolean insertTarjetaCliente(TarjetaClienteTO tarjetaClienteTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(INSERT);

			ps.setInt(1, tarjetaClienteTO.getIdTarjeta());
			ps.setInt(2, tarjetaClienteTO.getIdCliente());
			ps.setBoolean(3, tarjetaClienteTO.getActivo());
			
			ps.executeUpdate();
			return true;
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}
	}

	@Override
	public ArrayList<TarjetaClienteTO> selectTarjetaCliente() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			TarjetaDAO tarjetaDAO = null;

			ArrayList<TarjetaClienteTO> tarjetaClienteTO = null;
			TarjetaClienteTO tarjetaClienteTO2 = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<TarjetaTO> tarjetaTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECT);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (tarjetaClienteTO == null) {
					tarjetaClienteTO = new ArrayList<TarjetaClienteTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					tarjetaDAO = fabricaMySQL.getTarjetaDAO();
				}

				int idTarjetaCliente = rs.getInt("id_tarjeta_cliente");
				clienteTO = new ArrayList<ClienteTO>();
				tarjetaTO = new ArrayList<TarjetaTO>();
				tarjetaClienteTO2 = new TarjetaClienteTO();
				
				tarjetaTO.add(tarjetaDAO.findTarjetaById(rs
						.getInt("id_tarjeta")));
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				
				boolean activo = rs.getBoolean("activo");

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])tarjetaTO.toArray(new TarjetaTO[tarjetaTO.size()]);
				
				tarjetaClienteTO2 = new TarjetaClienteTO(
						idTarjetaCliente, arrTarjetaTO, arrClienteTO, activo);

				tarjetaClienteTO.add(tarjetaClienteTO2);
			}
			ps.close();
			conexion.close();
			return tarjetaClienteTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public ArrayList<TarjetaClienteTO> selectTarjetaClienteActivo() {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
			// Crea la fabrica especifica de MySQL
			FabricaDeDAOs fabricaMySQL = null;
			// Crea un DAO para la tabla Cliente
			ClienteDAO clienteDAO = null;
			TarjetaDAO tarjetaDAO = null;

			ArrayList<TarjetaClienteTO> tarjetaClienteTO = null;
			TarjetaClienteTO tarjetaClienteTO2 = null;
			ArrayList<ClienteTO> clienteTO = null;
			ArrayList<TarjetaTO> tarjetaTO = null;

			PreparedStatement ps = conexion.prepareStatement(SELECTACTIVO);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (tarjetaClienteTO == null) {
					tarjetaClienteTO = new ArrayList<TarjetaClienteTO>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					tarjetaDAO = fabricaMySQL.getTarjetaDAO();
				}

				int idTarjetaCliente = rs.getInt("id_tarjeta_cliente");
				clienteTO = new ArrayList<ClienteTO>();
				tarjetaTO = new ArrayList<TarjetaTO>();
				tarjetaClienteTO2 = new TarjetaClienteTO();
				
				tarjetaTO.add(tarjetaDAO.findTarjetaById(rs
						.getInt("id_tarjeta")));
				clienteTO.add(clienteDAO.findClienteById(rs
						.getInt("id_cliente")));
				
				boolean activo = rs.getBoolean("activo");

				ClienteTO[] arrClienteTO = (ClienteTO[])clienteTO.toArray(new ClienteTO[clienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])tarjetaTO.toArray(new TarjetaTO[tarjetaTO.size()]);
				
				tarjetaClienteTO2 = new TarjetaClienteTO(
						idTarjetaCliente, arrTarjetaTO, arrClienteTO, activo);

				tarjetaClienteTO.add(tarjetaClienteTO2);
			}
			ps.close();
			conexion.close();
			return tarjetaClienteTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TarjetaClienteTO selectTarjetaClienteActivoByCliente(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			ClienteDAO clienteDAO = null;
			TarjetaDAO tarjetaDAO = null;

			TarjetaClienteTO TarjetaClienteTO = null;
			ArrayList<ClienteTO> listClienteTO = null;
			ArrayList<Integer> listIdTarjetaCliente = null;
			ArrayList<TarjetaTO> listTarjetaTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYCLIENTE);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTarjetaCliente == null) {
					listClienteTO = new ArrayList<ClienteTO>();
					listIdTarjetaCliente = new ArrayList<Integer>();
					listTarjetaTO = new ArrayList<TarjetaTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					tarjetaDAO = fabricaMySQL.getTarjetaDAO();
				}

				listIdTarjetaCliente.add(rs.getInt("id_tarjeta_cliente"));
				listTarjetaTO.add(tarjetaDAO.findTarjetaById(rs
						.getInt("id_tarjeta")));
				listActivo.add(true);
			}
			if (listIdTarjetaCliente != null) {
				listClienteTO.add(clienteDAO.findClienteById(idCliente));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])listClienteTO.toArray(new ClienteTO[listClienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])listTarjetaTO.toArray(new TarjetaTO[listTarjetaTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdTarjetaCliente = (Integer[])listIdTarjetaCliente.toArray(new Integer[listIdTarjetaCliente.size()]);
				
				TarjetaClienteTO = new TarjetaClienteTO(
						arrIdTarjetaCliente, arrTarjetaTO, arrClienteTO,
						arrActivo);
			}

			ps.close();
			conexion.close();
			return TarjetaClienteTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TarjetaClienteTO selectTarjetaClienteActivoByTarjeta(int idTarjeta) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			ClienteDAO clienteDAO = null;
			TarjetaDAO tarjetaDAO = null;

			TarjetaClienteTO TarjetaClienteTO = null;
			ArrayList<ClienteTO> listClienteTO = null;
			ArrayList<Integer> listIdTarjetaCliente = null;
			ArrayList<TarjetaTO> listTarjetaTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTACTIVOBYTARJETA);

			ps.setInt(1, idTarjeta);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTarjetaCliente == null) {
					listClienteTO = new ArrayList<ClienteTO>();
					listIdTarjetaCliente = new ArrayList<Integer>();
					listTarjetaTO = new ArrayList<TarjetaTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					tarjetaDAO = fabricaMySQL.getTarjetaDAO();
				}

				listIdTarjetaCliente.add(rs.getInt("id_tarjeta_cliente"));
				listClienteTO.add(clienteDAO.findClienteById(rs.getInt("id_cliente")));
				listActivo.add(true);
			}
			if (listIdTarjetaCliente != null) {
				listTarjetaTO.add(tarjetaDAO.findTarjetaById(idTarjeta));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])listClienteTO.toArray(new ClienteTO[listClienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])listTarjetaTO.toArray(new TarjetaTO[listTarjetaTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdTarjetaCliente = (Integer[])listIdTarjetaCliente.toArray(new Integer[listIdTarjetaCliente.size()]);
				
				TarjetaClienteTO = new TarjetaClienteTO(
						arrIdTarjetaCliente, arrTarjetaTO, arrClienteTO,
						arrActivo);
			}

			ps.close();
			conexion.close();
			return TarjetaClienteTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TarjetaClienteTO selectTarjetaClienteByCliente(int idCliente) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			ClienteDAO clienteDAO = null;
			TarjetaDAO tarjetaDAO = null;

			TarjetaClienteTO TarjetaClienteTO = null;
			ArrayList<ClienteTO> listClienteTO = null;
			ArrayList<Integer> listIdTarjetaCliente = null;
			ArrayList<TarjetaTO> listTarjetaTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYCLIENTE);

			ps.setInt(1, idCliente);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTarjetaCliente == null) {
					listClienteTO = new ArrayList<ClienteTO>();
					listIdTarjetaCliente = new ArrayList<Integer>();
					listTarjetaTO = new ArrayList<TarjetaTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					tarjetaDAO = fabricaMySQL.getTarjetaDAO();
				}

				listIdTarjetaCliente.add(rs.getInt("id_tarjeta_cliente"));
				listTarjetaTO.add(tarjetaDAO.findTarjetaById(rs
						.getInt("id_tarjeta")));
				listActivo.add(true);
			}
			if (listIdTarjetaCliente != null) {
				listClienteTO.add(clienteDAO.findClienteById(idCliente));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])listClienteTO.toArray(new ClienteTO[listClienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])listTarjetaTO.toArray(new TarjetaTO[listTarjetaTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdTarjetaCliente = (Integer[])listIdTarjetaCliente.toArray(new Integer[listIdTarjetaCliente.size()]);
				
				TarjetaClienteTO = new TarjetaClienteTO(
						arrIdTarjetaCliente, arrTarjetaTO, arrClienteTO,
						arrActivo);
			}

			ps.close();
			conexion.close();
			return TarjetaClienteTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public TarjetaClienteTO selectTarjetaClienteByTarjeta(int idTarjeta) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();
		
			FabricaDeDAOs fabricaMySQL = null;
		
			ClienteDAO clienteDAO = null;
			TarjetaDAO tarjetaDAO = null;

			TarjetaClienteTO TarjetaClienteTO = null;
			ArrayList<ClienteTO> listClienteTO = null;
			ArrayList<Integer> listIdTarjetaCliente = null;
			ArrayList<TarjetaTO> listTarjetaTO = null;
			ArrayList<Boolean> listActivo = null;
			PreparedStatement ps = conexion
					.prepareStatement(SELECTBYTARJETA);

			ps.setInt(1, idTarjeta);

			ResultSet rs = ps.executeQuery();

			while (rs.next()) {
				if (listIdTarjetaCliente == null) {
					listClienteTO = new ArrayList<ClienteTO>();
					listIdTarjetaCliente = new ArrayList<Integer>();
					listTarjetaTO = new ArrayList<TarjetaTO>();
					listActivo = new ArrayList<Boolean>();
					fabricaMySQL = FabricaDeDAOs
							.getFabricaDeDAOs(mx.ipn.Constantes.FABRICA_DAOS_MYSQL);

					clienteDAO = fabricaMySQL.getClienteDAO();
					tarjetaDAO = fabricaMySQL.getTarjetaDAO();
				}

				listIdTarjetaCliente.add(rs.getInt("id_tarjeta_cliente"));
				listClienteTO.add(clienteDAO.findClienteById(rs.getInt("id_cliente")));
				listActivo.add(true);
			}
			if (listIdTarjetaCliente != null) {
				listTarjetaTO.add(tarjetaDAO.findTarjetaById(idTarjeta));
				
				ClienteTO[] arrClienteTO = (ClienteTO[])listClienteTO.toArray(new ClienteTO[listClienteTO.size()]);
				TarjetaTO[] arrTarjetaTO = (TarjetaTO[])listTarjetaTO.toArray(new TarjetaTO[listTarjetaTO.size()]);
				Boolean[] arrActivo = (Boolean[])listActivo.toArray(new Boolean[listActivo.size()]);
				Integer[] arrIdTarjetaCliente = (Integer[])listIdTarjetaCliente.toArray(new Integer[listIdTarjetaCliente.size()]);
								
				TarjetaClienteTO = new TarjetaClienteTO(
						arrIdTarjetaCliente, arrTarjetaTO, arrClienteTO,
						arrActivo);
			}

			ps.close();
			conexion.close();
			return TarjetaClienteTO;

		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	@Override
	public short updateTarjetaCliente(TarjetaClienteTO tarjetaClienteTO) {
		try {
			Connection conexion = FabricaDeDAOsMySQL.crearConexion();

			PreparedStatement ps = conexion.prepareStatement(UPDATE);

			ps.setInt(1, tarjetaClienteTO.getIdTarjeta());
			ps.setInt(2, tarjetaClienteTO.getIdCliente());
			ps.setBoolean(3, tarjetaClienteTO.getActivo());
			ps.setInt(4, tarjetaClienteTO.getIdTarjetaCliente());
			
			ps.executeUpdate();

			if (ps.getUpdateCount() == 0) {
				ps.close();
				conexion.close();
				return 0;
			}

			else {
				ps.close();
				conexion.close();
				return 1;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return (short) -1;
		}
	}

}
